//
//  "$Id$"
//
//  Copyright (c)1992-2009, ZheJiang Dahua Technology Stock CO.LTD.
//  All Rights Reserved.
//
//	Description:	雷达接口
//	Revisions:		Year-Month-Day  SVN-Author  Modification
//

#ifndef __RADAR_API_H__
#define __RADAR_API_H__

#include "Types.h"
#include "Defs.h"

#ifdef __cplusplus
extern "C" {
#endif

/// \defgroup radarAPI API Radar
/// 雷达操作接口
///	\n 调用流程图:
/// \code
///    ===========================
///                |
///        createRadar
///                |
///             addRef
///                |
///             getCaps
///                |
///         setPowerMode
///                |
///         getPowerMode
///                |
///                |\--------------+
///        +------\|               |
///        |  getPacket        setConfig
///        +------/|               |
///                |/--------------+
///             release
///                |
///    ===========================
/// \endcode
/// @{

/// 雷达类型
typedef enum RadarType
{
	radarDahua = 0,		///< 大华雷达
	radarRussia,		///< 俄罗斯雷达
	radarTrans,			///< 川苏雷达
	radarCount			///< 雷达总数
}RadarType;

/// 雷达设备特性结构，128字节
typedef struct RadarCaps
{
	uchar 	minSpeed;		///< 雷达检测的最小速度，单位：km/h
	uchar	maxSpeed;		///< 雷达检测的最大速度，单位：km/h
	char		powerMode;		///< 是否支持电源控制，0-不支持，1-支持
	int 		reserved[31];		///< 保留
}RadarCaps;

/// 雷达检测模式
typedef enum RadarDetectMode
{
	radarDetectModeFrontCarHead = 0,	///< 前向来车
	radarDetectModeFrontCarTail,		///< 前向去车
	radarDetectModeBackCarHead,			///< 后向来车
	radarDetectModeBackCarTail,			///< 后向去车
	radarDetectModeFrontCar,			///< 前向双向
	radarDetectModeBackCar,				///< 后向双向
	radarDetectModeFrontBackCar,		///< 前后双向
	radarDetectModeAll					///< 模式总数
}RadarDetectMode;

/// 雷达检测结果，128字节
typedef struct RadarDetectPacket
{
	uchar			speed;			///< 车速值
	RadarDetectMode	direction:8;	///< 行驶方向
	int				reserved[31];	///< 保留
}RadarDetectPacket;

/// 雷达设备配置信息，512字节
typedef struct RadarConfig
{
	union
	{
		struct RadarDahuaConfig
		{
			char 	sensitivity;		///< 灵敏度，0~5,0级最高
			RadarDetectMode	detectMode:8;///< 检测模式
			char	angle;				///< 雷达安装角度，范围0~90，单位：度
			char	multiTargetFilter;	///< 多目标过滤开关，0-关，1-开
			
			char	unit;				///< 速度单位，0-公里，1-英里
			char	workMode;			///< 工作模式，0-脉冲波，1-连续，2-手动
			char	lowSpeedLimit;		///< 低限速开关，0-关闭，1-打开
			char	carSizeLimit;		///< 大小车限速开关，0-关闭，1-打开
			
			uchar	speedLimitRange[2];	///< 限速上下限，单位km/h，范围5~255，第一个元素是低限速值，第二个元素是高限速值
			uchar	speedLimitValue;	///< 限速值			
			uchar	speedTriggerValue;	///< 触发值
			
			uchar	smallCarLimit;		///< 大小车限速值，单位：km/h，区分大小车时只用于小车限速
			uchar	bigCarLimit;		///< 大车限速值，单位：km/h，区分大小车时启用
			uchar	smallCarTrigger;	///< 大小车触发值，单位：km/h，区分大小车时只用于小车触发
			uchar	bigCarTrigger;		///< 大车触发值，单位：km/h，区分大小车时启用			
			
			char	chooseTargetMode;	///< 首选目标方式，0-最快，1-最慢，2-最强
			char	microWaveHead;		///< 微波头是否挂起，0-正常，1-挂起
			short	minInterval;		///< 检测车辆的最小间隔，单位：ms
			
			char	selfMode;			///< 0-静止，1-运动
		}dahua;
	}config;
	int reserved[128];
}RadarConfig;

/// 雷达接口，512字节
typedef struct Radar
{
	/// 底层私有数据
	void *priv;
	
	/// 增加接口引用
	///
	/// \param[in] thiz 雷达接口指针
	/// \retval 0 成功
	/// \retval <0 失败
	int (*addRef)(struct Radar *thiz);
	
	/// 释放接口
	///
	/// \param[in] thiz 雷达接口指针
	/// \retval 0 成功
	/// \retval <0 失败
	int (*release)(struct Radar *thiz);
	
	/// 得到雷达能力
	///
	/// \param [in] thiz 雷达接口指针
	/// \param [out] caps 雷达特性结构RadarCaps指针
	/// \retval 0获取成功
	/// \retval <0获取失败
	int (*getCaps)(struct Radar *thiz, RadarCaps *caps);
	
	/// 雷达电源控制
	///
	/// \param thiz[in] 雷达接口指针
	/// \param state[in] 电源操作，0-关闭电源，1-打开电源
	/// \retval 0 成功
	/// \retval <0失败
	int (*setPowerMode)(struct Radar *thiz, int state);
	
	/// 获取雷达电源状态
	///
	/// \param [in] thiz 雷达接口指针
	/// \param [out] state 雷达电源状态，0-关闭，1-上电
	/// \retval 0 成功
	/// \retval <0 失败
	int (*getPowerMode)(struct Radar *thiz, int *state);
	
	/// 获取雷达工作状态
	///
	/// \param [in] thiz 雷达接口指针
	/// \param [in] state 雷达工作状态，0-停止工作，1-工作
	/// \retval 0 成功
	/// \retval <0 失败
	int (*getWorkingState)(struct Radar *thiz, int *state);
	
	/// 获取雷达软件版本
	///
	/// \param [in] thiz 雷达接口指针
	/// \param [in/out] version 雷达版本缓冲指针
	/// \param [in] 雷达版本缓冲长度
	int (*getVersion)(struct Radar *thiz, char *version, int length);
	
	/// 设置雷达配置
	///
	/// \param [in] thiz雷达接口指针
	/// \param [in] config 雷达配置指针
	/// \reval 0 成功
	/// \reval <0失败
	int (*setConfig)(struct Radar *thiz, RadarConfig *config);
	
	/// 取得雷达检测结果，阻塞模式，有检测到车辆才返回
	///
	/// \param [in] thiz 雷达接口指针
	/// \param [out] packet 雷达检测结果数据包
	/// \param 0 成功
	/// \param <0失败
	int (*getPacket)(struct Radar *thiz, RadarDetectPacket *packet);
	
	/// 保留字节
	int reserved[118];
}Radar;

/// 雷达接口描述，128字节
typedef struct RadarDesc
{
	RadarType 	type:8;			///< 类型
	int			reserved[31];	///< 保留
}RadarDesc;

/// 创建雷达接口
///
/// \param [in] desc 雷达接口描述结构RadarDesc指针
/// \param [out] radar 雷达接口指针的指针
/// \retval 0 成功
/// \retval <0 失败
int PAL_API createRadar(RadarDesc *desc, Radar **radar);

/// 取得支持的雷达
///
/// \param [in] mask 支持的雷达掩码指针
void PAL_API getSupportedRadar(uint *mask);

/// @} end of group
#ifdef __cplusplus
}
#endif

#endif //__RADAR_API_H__
